const EventEmitter = require("events");

function Girl() {}

// 原型继承  Girl.prototype.__proto__ = EventEmitter.prototype
Object.setPrototypeOf(Girl.prototype, EventEmitter.prototype);

// Object.create() 实现原型继承

const girl = new Girl();
let set = new Set();
let waiting = false;
girl.on("newListener", function (eventName) {
  // 1.第一次绑定我失恋了.
  // 每调用on、once的时候都会触发此事件
  if (!set.has(eventName)) {
    set.add(eventName);
  }
  // 开启一个异步任务做触发操作
  if (waiting) {
    // 屏蔽掉多次执行的操作
    return;
  } // 防抖处理
  waiting = true;
  process.nextTick(() => {
    waiting = false;
    set.forEach((eventName) => {
      girl.emit(eventName); // 最终在一次的异步任务重触发所有的通知
    });
  });
  girl.emit(eventName);
});

let cry = function () {
  console.log("cry");
};
girl.on("当我失恋了", cry);
girl.on("当我失恋了", function () {
  console.log("sleep");
});
girl.on("当我失恋了", function () {
  console.log("eat");
});

// girl.off("当我失恋了", cry);
// girl.emit("当我失恋了", "xxx"); // 当我们触发了一次失恋之后，会将哭得我回调移除掉
// girl.emit("当我失恋了", "xxx");
// 主要的发布订阅就是 on 和 emit这两个方法， 也可以订阅后移除事件off  mitt
// once 绑定一次

// on , emit , off ,once , on('newListener') 每次调用on方法都会先执行newListener
